from django.shortcuts import render

# Create your views here.
from rest_framework import viewsets

# get get请求 用于获取页面数据
# post post请求 用于提交数据
# 自定义一些方法来操作处理
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.status import *

from drfstudy.models import Student, Classes
from drfstudy.serializers import StudentSerializer, ClassesSerializer

'''
list() 提供一组数据
retrieve() 提供单个数据
create() 创建数据
update() 修改数据
destroy() 删除数据
'''


# class StudentViewSet(viewsets.ViewSet):
#     def list(self, request):
#         student = Student.objects.filter(is_delete=False)
#         # 把模型对象 结果集转换成json格式的数据 [] {}
#         # 初始化函数的一个参数是 instance是一个实例
#         serializer = StudentSerializer(student, many=True)
#         print(serializer.data, type(serializer.data))
#         return Response(serializer.data)
#
#     def create(self, request):
#         # 前端的数据，直接默认传会传递给instance 所以需要指定参数传值
#         serializer = StudentSerializer(data=request.data)
#         # 对数据进行校验 如果校验没有通过会发生异常信息，
#         serializer.is_valid(raise_exception=True)
#         # 持久化数据 保存数据
#         serializer.save()
#         return Response(serializer.data)
#
#     # 你要查询的数据id
#     def retrieve(self, request, pk):
#         # pk 指定数据id 路由参数 操作模型查询指定的数据
#         try:
#             # 根据id查询到的学生对象
#             student = Student.objects.filter(is_delete=False).get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         # 学生对象传给序列化器，做反序列化的操作
#         serializer = StudentSerializer(student)
#         print(serializer.data)
#         # 把转换后的数据响应给前端
#         return Response(serializer.data)
#
#     def update(self, request, pk):
#         try:
#             # 根据id查询到的学生对象
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#
#         # 得到用户修改后的值，前端传递过来的数据，我们查询到的数据库里面的数据
#         serializer = StudentSerializer(student, data=request.data)
#         # 校验数据
#         serializer.is_valid()
#         # 修改 持久化数据
#         serializer.save()  # update 方法
#         return Response(serializer.data)
#
#     def destroy(self, request, pk):
#         try:
#             # 根据id查询到的学生对象
#             student = Student.objects.get(id=pk)
#         except Student.DoesNotExist:
#             return Response(status=HTTP_404_NOT_FOUND)
#         # 删除 并不是想要把学生数据删除 而是隐藏
#         student.delete()
#         # 请求是成功 但是没有内容
#         return Response(status=HTTP_204_NO_CONTENT)


class StudentViewSet(viewsets.ModelViewSet):
    # 指定增删改查的数据集
    queryset = Student.objects.filter(is_delete=False)
    # 指定序列化器类
    serializer_class = StudentSerializer


class ClassesViewSet(viewsets.ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)
    serializer_class = ClassesSerializer

    # 返回最新的班级 有没有参数 pk
    # api设计 GET/classes/last
    # 给我们自定义的方式生成路由
    @action(methods=['get'], detail=False)
    def last(self, request):
        classes = Classes.objects.last()
        # ClassesSerializer(data)
        data = self.get_serializer(classes).data
        return Response(data)

    # 获取指定班级的最后一个学生
    # pk是班级的id
    # api设计：GET classes/<pk>/student/last
    # 修改路由 把方法名路由修改为自定义路由
    @action(methods=['get'], detail=True, url_path='student/last')
    def last_student(self, request, pk):
        try:
            classes = Classes.objects.get(id=pk)
        except Classes.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)
        # 获取指定班级的最后一个学生
        classes_student_set = classes.student_set.last()
        data = StudentSerializer(classes_student_set).data
        return Response(data)
